#include "includes.h"
using namespace std;

class semtd;

class semtd
{
private:
	//graphType: 0=path, 1=cycle, 2=completebipartite, 3=wheel, 4=fan, 5=doublefan
	//vector< vector<bool> > theGraph;
	bool theGraph[1000][1000];
	bool isQuickMode;
	bool isSureFail;
	vector< vector<uint32_t> > edgeLabels;
	vector<uint32_t> edgeLabelsUsed;
	uint32_t edgeLabelAbsoluteMax,edgeLabelMin,edgeLabelMax;
	double scoreCache;
	inline uint32_t edgeLabelRange();
	void setEdgeLabels(uint32_t verPos);
	void removeEdgeLabels(uint32_t verPos);
	void refreshEdgeLabelsMinMax();
	void resetLabels(uint32_t mode);
	void draw(uint32_t drawType,uint32_t start,uint32_t end);
	void draw(uint32_t drawType,uint32_t start,uint32_t end,uint32_t extra);
	inline void connectVertices(uint32_t a,uint32_t b);
	bool isValidRange(uint32_t min,uint32_t max);
public:
	uint32_t numDef,numEdges,graphType;
	semtd();
	semtd(uint32_t graphType, uint32_t numVer, uint32_t numDef);
	uint32_t NumVer,TotalVer;
	vector<uint32_t> VerLabels;
	string Print(uint32_t withDual);
	void FixLabel();
	void SwapLabel();
	bool IsSemt();
	double SemtScore();
	void SetVerLabel(uint32_t verPos,uint32_t verLabel);
	void RemoveVerLabel(uint32_t verPos);
	bool IsValidToLabel(uint32_t verPos,uint32_t verLabel);
	uint32_t MinDef();
};

